<?php

require __DIR__.'/autoloader.php';
use phpspider\core\phpspider;
use phpspider\core\requests;    //请求类
use phpspider\core\selector;    //选择器类
use phpspider\core\db;    //选择器类
use phpspider\core\log;    //选择器类

/* Do NOT delete this comment */
/* 不要删除这段注释 */

$configs = array(
    'name' => '爬取网络图片',
    //'log_show' => true,
    //定义爬虫爬取哪些域名下的网页, 非域名下的url会被忽略以提高爬取速度
    'domains' => array(
        'www.umei.cc'    //写域名
    ),
    //定义爬虫的入口链接, 爬虫从这些链接开始爬取,同时这些链接也是监控爬虫所要监控的链接
    'scan_urls' => array(
        'http://www.umei.cc/touxiangtupian/'
    ),
    //定义内容页url的规则
    'content_url_regexes' => array(
        "http://www.umei.cc/touxiangtupian/([0-9]{0,2})?.htm"
    ),
    //爬虫爬取数据导出
    'export' => array(
        'type' => 'db',
        'table'=> 'umei',    //表名
    ),
    'db_config' => array(
        'host'  => 'localhost',
        'port'  => 3306,
        'user'  => 'root',//mysql的账号
        'pass'  => 'root',//mysql的密码
        'name'  => 'spider',   //库名
    ),

    'fields' => array(
        //从列表页开始爬
        array(
            'name' => "lists",
            'selector' => "//div[contains(@class,'TypeList')]//ul//li",
            'required' => true,
            'repeated' => true  //写上是数组（抓的是整个列表页），不写是字符串（只抓第一个）
        ),
    ),

);
$spider = new phpspider($configs);

//爬虫初始化时调用, 用来指定一些爬取前的操作
//$spider->on_start = function($spider)
//{
//    requests::set_header("Referer", "http://www.ncnews.com.cn/xwzx/ncxw/twnc/index.html");
//};

//在爬取到入口url的内容之后, 添加新的url到待爬队列之前调用. 主要用来发现新的待爬url, 并且能给新发现的url附加数据（点此查看“url附加数据”实例解析）.
$spider->on_scan_page = function($page,$content,$spider){
    for($i=0;$i<50;$i++){
        if($i == 0){    //第一页
            $url = "http://www.umei.cc/touxiangtupian/1.htm";
        }else{          //之后的n页
            $url = "http://www.umei.cc/touxiangtupian/{$i}.htm";
        }
        $options = [
            'method' => 'get',
            'params' => [
                'page' => $i
            ],
        ];
        $spider->add_url($url,$options);    //添加新的url到待爬队列
    }
};

/**
 * 对匹配后的字段field进行回调处理
 * @param $filename
 * @param $data
 * @param $page
 * @return array
 */
$spider->on_extract_field = function($filename,$data,$page){
    $arr = [];
    //处理抽取到的fields中name == lists的数据
    if($filename == 'lists'){
        if(is_array($data)){
            foreach ($data as $k=>$v){
                $img = selector::select($v,"//img");
                //没有封面不需要此数据
                if(empty($img)){
                    unset($data[$k]);
                }else{
                    //抓标题
                    $title = selector::select($v,'//a//span');
                    //链接
                    $reg="/href=\"([^\"]+)/";
                    $link = selector::select($v,$reg,'regex');
                    //组装数据
                    $arr[$k] = [
                        'title' => $title,
                        'link' => $link,
                        'img' => $img
                    ];
                }
            }
        }
    }
    return $arr;
};

//入库操作
$spider->on_extract_page = function($page,$data){
//    echo "<pre>";
//    var_dump($data);
//    die;
    //处理哪个数据
    if(isset($data['lists'])){
        foreach($data['lists'] as $v){
            $arr = [
                'title' => trim($v['title']),
                'img' => $v['img'],
                'link' => $v['link'],
                'create_at'=>date('Y-m-d H:i:s',time())
            ];

            //标题重复就不入库
            $sql  = "select count(*) as `count` from `umei` where `title`".$v['title'];
            $row = db::get_one($sql);
            if(!$row['count']){
                db::insert('umei',$arr);
            }
        }
        $data = $arr;
    }
    return $data;
};
$spider->start();
